--- channels/chan_sip.c.orig 2007-05-12 01:17:10.000000000 -0400 +++ channels/chan_sip.c 2007-05-12 01:33:02.000000000 -0400 @@ -802,8 +802,8 @@ #define SIP_PAGE2_T38SUPPORT_RTP (2 << 20) /*!< 21: T38 Fax Passthrough Support (not implemented) */ #define SIP_PAGE2_T38SUPPORT_TCP (4 << 20) /*!< 22: T38 Fax Passthrough Support (not implemented) */ #define SIP_PAGE2_CALL_ONHOLD (3 << 23) /*!< Call states */ -#define SIP_PAGE2_CALL_ONHOLD_ONEDIR (1 << 23) /*!< 23: One directional hold */ -#define SIP_PAGE2_CALL_ONHOLD_INACTIVE (1 << 24) /*!< 24: Inactive */ +#define SIP_PAGE2_CALL_ONHOLD_2DIR (1 << 23) /*!< 23: Two directional call */ +#define SIP_PAGE2_CALL_ONHOLD_ACTIVE (1 << 24) /*!< 24: Active */ #define SIP_PAGE2_RFC2833_COMPENSATE (1 << 25) /*!< 25: Compensate for buggy RFC2833 implementations */ #define SIP_PAGE2_BUGGY_MWI (1 << 26) /*!< 26: Buggy CISCO MWI fix */ #define SIP_PAGE2_NOTEXT (1 << 27) /*!< 27: Text not supported */ @@ -5687,7 +5687,7 @@ ast_set_write_format(p->owner, p->owner->writeformat); } - if (ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD) && sin.sin_addr.s_addr && (!sendonly || sendonly == -1)) { + if (ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD) && sin.sin_addr.s_addr && sendonly != -1) { ast_queue_control(p->owner, AST_CONTROL_UNHOLD); /* Activate a re-invite */ ast_queue_frame(p->owner, &ast_null_frame); @@ -5702,7 +5702,7 @@ if (global_notifyhold) sip_peer_hold(p, FALSE); ast_clear_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD); /* Clear both flags */ - } else if (!sin.sin_addr.s_addr || (sendonly && sendonly != -1)) { + } else if (!sin.sin_addr.s_addr && sendonly != -1) { ast_queue_control_data(p->owner, AST_CONTROL_HOLD, S_OR(p->mohsuggest, NULL), !ast_strlen_zero(p->mohsuggest) ? strlen(p->mohsuggest) + 1 : 0); @@ -5721,10 +5721,11 @@ p->owner->uniqueid); } if (sendonly == 1) /* One directional hold (sendonly/recvonly) */ - ast_set_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD_ONEDIR); + ast_set_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD ^ SIP_PAGE2_CALL_ONHOLD_2DIR); else if (sendonly == 2) /* Inactive stream */ - ast_set_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD_INACTIVE); - + ast_set_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD ^ SIP_PAGE2_CALL_ONHOLD_ACTIVE); + else + ast_set_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD); if (global_notifyhold) sip_peer_hold(p, TRUE); } @@ -6802,9 +6803,9 @@ snprintf(connection, sizeof(connection), "c=IN IP4 %s\r\n", ast_inet_ntoa(dest.sin_addr)); ast_build_string(&m_audio_next, &m_audio_left, "m=audio %d RTP/AVP", ntohs(dest.sin_port)); - if (ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD_ONEDIR)) + if (!ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD_2DIR)) hold = "a=recvonly\r\n"; - else if (ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD_INACTIVE)) + else if (!ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD_ACTIVE)) hold = "a=inactive\r\n"; else hold = "a=sendrecv\r\n";